剑指Offer 07.重建二叉树

  1. 题目
  2. 分治(不带index辅助)
  3. 分治(利用index优化空间复杂度)

题目

分治(不带index辅助)

  • 这个自己写的,空间复杂度较高

    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    *     int val;
    *     TreeNode *left;
    *     TreeNode *right;
    *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    * };
    */
    class Solution {
    public:
      TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
          if(preorder.empty() || inorder.empty()) return NULL;
          //1. find root                              3
          //2. split into left & right                9 | 3 | 15 20 7
          //3. 分治
    
          int rootVal = preorder[0];
          TreeNode* root = new TreeNode(rootVal);
          vector<int>::iterator inorderRootPos;
          inorderRootPos = find(inorder.begin(),inorder.end(),rootVal);
          vector<int> inorderLeft(inorder.begin(),inorderRootPos);//注意范围
          vector<int> inorderRight(inorderRootPos+1,inorder.end());
          // //  inorder  L ROOT R
          // //  preorder Root L R
          int leftElemtNum = inorderRootPos-inorder.begin();
          vector<int> preorderLeft(preorder.begin()+1,preorder.begin()+leftElemtNum+1);
          vector<int> preorderRight(preorder.begin()+leftElemtNum+1,preorder.end());
    
          TreeNode* LeftChild = buildTree(preorderLeft,inorderLeft);
          TreeNode* RightChild = buildTree(preorderRight,inorderRight);
          root->left = LeftChild;
          root->right = RightChild;
          return root;
      }
    };
    
  • 时间复杂度:O(N)
  • 空间复杂度:O(N+h)=O(N) [h为构造的树的高度,这里还有多次的创建数组的空间]

分治(利用index优化空间复杂度)